package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import lib.Database;

abstract public class DbDao {
    protected Database _db;
    protected ResultSet _resultSet;
    
    /**
     * Dao构造函数 
     */
    public DbDao() {
        this._db            = new Database();
        this._resultSet     = null;
        this._db.connect();
    }
   
    /**
     * 执行查询 
     */
    public boolean query(String sql) {
        try {
            this._resultSet     = this._db.query(sql);
            return true;
        } catch(Exception ex) {
            return false;
        }
    }
    
    /**
     * 添加用户
     * 
     * @param String sql 执行语句
     * @return boolean true or false 是否成功
     */
    public boolean insert(String sql) {
        return this._db.insert(sql);
    }
    
    /**
     * 更新数据
     * 
     * @param String sql Sql语句
     * @return boolean true or false 是否成功
     */
    public boolean update(String sql) {
        return this._db.update(sql);
    }
  
    /**
     * 删除数据 
     */
    public boolean delete(String sql) {
        return this._db.delete(sql);
    }
   
    /**
     * 得到最一条记录ID
     */
    public int getLastInsertId(String tableName, String keyName) {
        String sql  = String.format("SELECT MAX(`%s`) AS max_id FROM `%s`;",
                                    keyName,
                                    tableName);
        if(false == this.query(sql)) {
            return 0;
        }
        try {
            while(this._resultSet.next()) {
                return this._resultSet.getInt("max_id");
            }
            return 0;
        } catch(SQLException ex) {
            System.out.println(ex.getMessage());
            return 0;
        }
    }
    
    /**
     * 关闭数据库 
     */
    public void closeDb() {
        this._db.closeConnection();
    }
    
    /**
     * 查询一行结果 
     */
    abstract public Object fetch(); 
   
    /**
     * 得到所有的结果集 
     */
    abstract public ArrayList fetchAll();
    
}
